package io.renren.common.utils.json;

import com.alibaba.fastjson.parser.DefaultJSONParser;
import com.alibaba.fastjson.parser.JSONLexer;
import com.alibaba.fastjson.parser.JSONToken;
import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer;
import io.renren.common.constants.enums.EnumValue;

import java.lang.reflect.Type;
import java.util.Arrays;

/**
 * @program: simida
 * @description: 枚举类型反序列化配置
 * @author: miaoguoxin
 * @create: 2019-10-29 17:08
 **/
public class EnumValueDeserializer implements ObjectDeserializer {
    @Override
    public <T> T deserialze(DefaultJSONParser parser, Type type, Object o) {
        final JSONLexer lexer = parser.lexer;
        final int token = lexer.token();
        Class cls = (Class) type;
        Object[] enumConstants = cls.getEnumConstants();
        if (EnumValue.class.isAssignableFrom(cls)) {
            return (T) Arrays.stream(enumConstants)
                    .filter(enumConstant -> ((EnumValue) enumConstant).value() == lexer.intValue())
                    .findFirst().orElse(null);
        } else {
            //没实现EnumValue接口的 默认的按名字或者按ordinal（序号）
            if (token == JSONToken.LITERAL_INT) {
                int intValue = lexer.intValue();
                lexer.nextToken(JSONToken.COMMA);

                if (intValue < 0 || intValue > enumConstants.length) {
                    return null;
                }
                return (T) enumConstants[intValue];
            } else if (token == JSONToken.LITERAL_STRING) {
                return (T) Enum.valueOf(cls, lexer.stringVal());
            }
        }
        return null;
    }

    @Override
    public int getFastMatchToken() {
        return JSONToken.LITERAL_INT;
    }
}